package org.jvalue.ods.db;
import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
import com.google.inject.TypeLiteral;
import com.google.inject.assistedinject.FactoryModuleBuilder;
import com.google.inject.name.Names;
import org.ektorp.CouchDbConnector;
import org.ektorp.CouchDbInstance;
import org.ektorp.http.StdHttpClient;
import org.ektorp.impl.StdCouchDbInstance;
import org.jvalue.commons.auth.UserRepository;
import org.jvalue.commons.couchdb.CouchDbConfig;
import org.jvalue.commons.couchdb.DbConnectorFactory;
import org.jvalue.commons.utils.Cache;
import java.net.MalformedURLException;
public class DbModule extends AbstractModule {
private final CouchDbConfig couchDbConfig;
public DbModule(CouchDbConfig couchDbConfig) {
this.couchDbConfig = couchDbConfig;
}
@Override
protected void configure() {
try {
CouchDbInstance couchDbInstance = new StdCouchDbInstance(new StdHttpClient.Builder()
.url(couchDbConfig.getUrl())
.username(couchDbConfig.getAdmin().getUsername())
.password(couchDbConfig.getAdmin().getPassword())
.maxConnections(couchDbConfig.getMaxConnections())
.build());
DbConnectorFactory connectorFactory = new DbConnectorFactory(couchDbInstance, couchDbConfig.getDbPrefix());
CouchDbConnector dataSourceConnector = connectorFactory.createConnector(DataSourceRepository.DATABASE_NAME, true);
bind(CouchDbConnector.class).annotatedWith(Names.named(DataSourceRepository.DATABASE_NAME)).toInstance(dataSourceConnector);
CouchDbConnector userConnector = connectorFactory.createConnector(UserRepository.DATABASE_NAME, true);
bind(CouchDbConnector.class).annotatedWith(Names.named(UserRepository.DATABASE_NAME)).toInstance(userConnector);
bind(DbConnectorFactory.class).toInstance(connectorFactory);
install(new FactoryModuleBuilder().build(RepositoryFactory.class));
bind(DataSourceRepository.class).in(Singleton.class);
bind(new TypeLiteral<Cache<DataViewRepository>>() { }).in(Singleton.class);
bind(new TypeLiteral<Cache<ProcessorChainReferenceRepository>>() { }).in(Singleton.class);
bind(new TypeLiteral<Cache<NotificationClientRepository>>() { }).in(Singleton.class);
bind(new TypeLiteral<Cache<PluginMetaDataRepository>>() { }).in(Singleton.class);
bind(new TypeLiteral<Cache<DataRepository>>() { }).in(Singleton.class);
} catch (MalformedURLException mue) {
throw new RuntimeException(mue);
}
}
}